<

新しい Android プラグイン API のサポート

Android Flutter プラグインを作成または保守していない場合は、 このページはスキップできます。

1.12 リリース以降、 新しいプラグイン API が Android プラットフォームで利用可能になりました。 古い API は以下に基づいていますPluginRegistry.Registrarすぐに廃止されるわけではありませんが、 ただし、以下に基づいて新しい API に移行することをお勧めします。FlutterPlugin

新しい API には、よりクリーンなセットを提供するという利点があります。 ライフサイクル依存コンポーネントのアクセサーの比較 古い API に。例えばPluginRegistry.Registrar.activity()次の場合は null を返す可能性があります Flutter はどのアクティビティにも関連付けられていません。

言い換えれば、古い API を使用するプラグインは未定義のデータを生成する可能性があります。 Flutter を Android アプリに埋め込むときの動作。 ほとんど flutterプラグインflutter.dev によって提供されます チームはすでに移行されています。 (なる方法を学ぶ検証済みの発行者pub.dev にあります!) 例としては、 新しい API を使用するプラグインについては、を参照してください。バッテリープラスパッケージ。

アップグレード手順

次の手順は、新しい API をサポートする手順の概要を示しています。

  1. メインのプラグイン クラスを更新します (*Plugin.java) を実装するには、FlutterPluginインターフェース。より複雑なプラグインの場合は、 分離することができますFlutterPluginMethodCallHandler2つのクラスに分けます。次のセクションを参照してください。基本プラグイン、 アプリのリソースへのアクセスの詳細については、 埋め込みの最新バージョン (v2)。

    また、プラグインには静的ファイルが含まれている必要があることに注意してください。registerWith()アプリとの互換性を維持するための方法 v2 Android 埋め込みは使用しないでください。 (見る1.12 より前の Android プロジェクトのアップグレード詳細については。) (可能であれば) 最も簡単な方法は、ロジックを次の場所から移動することです。registerWith()両方をプライベートメソッドに変換しますregisterWith()onAttachedToEngine()呼び出すことができます。 またregisterWith()またonAttachedToEngine()呼ばれるだろう、 両方ではありません。

    さらに、オーバーライドされていないパブリック メンバーをすべて文書化する必要があります。 プラグイン内で。アプリに追加するシナリオでは、 これらのクラスは開発者がアクセスでき、 書類が必要です。

  2. (オプション) プラグインが必要な場合は、Activity参照、 も実装しますActivityAwareインターフェース。

  3. (オプション) プラグインが次の場所に保持されることが予想される場合 バックグラウンド サービスをいつでも実装できます。ServiceAwareインターフェース。

  4. サンプルアプリの更新MainActivity.javaを使用する v2 埋め込みFlutterActivity。詳細については、を参照してください。1.12 より前の Android プロジェクトのアップグレード。 プラグイン クラスのパブリック コンストラクターを作成する必要がある場合があります。 まだ存在していない場合。例えば:

    MainActivity.java
    package io.flutter.plugins.firebasecoreexample;
    
    import io.flutter.embedding.android.FlutterActivity;
    import io.flutter.embedding.engine.FlutterEngine;
    import io.flutter.plugins.firebase.core.FirebaseCorePlugin;
    
    public class MainActivity extends FlutterActivity {
      // You can keep this empty class or remove it. Plugins on the new embedding
      // now automatically registers plugins.
    }
  5. (オプション) 削除した場合MainActivity.javaを更新します。<plugin_name>/example/android/app/src/main/AndroidManifest.xml使用するio.flutter.embedding.android.FlutterActivity。 例えば:

    AndroidManifest.xml
      <activity android:name="io.flutter.embedding.android.FlutterActivity"
              android:theme="@style/LaunchTheme"
     android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale"
              android:hardwareAccelerated="true"
              android:exported="true"
              android:windowSoftInputMode="adjustResize">
              <meta-data
                  android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                  android:value="true" />
              <intent-filter>
                  <action android:name="android.intent.action.MAIN"/>
                  <category android:name="android.intent.category.LAUNCHER"/>
              </intent-filter>
          </activity>
  6. (オプション)EmbeddingV1Activity.javaファイル サンプル プロジェクトに v1 埋め込みを使用する と同じフォルダ内MainActivityに v1 埋め込みの互換性をテストし続ける プラグインと一緒に。手動で行う必要があることに注意してください を使用する代わりにすべてのプラグインを登録しますGeneratedPluginRegistrant。例えば:

    EmbeddingV1Activity.java
    package io.flutter.plugins.batteryexample;
    
     import android.os.Bundle;
     import io.flutter.app.FlutterActivity;
     import io.flutter.plugins.battery.BatteryPlugin;
    
     public class EmbeddingV1Activity extends FlutterActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         BatteryPlugin.registerWith(registrarFor("io.flutter.plugins.battery.BatteryPlugin"));
       }
     }
  7. 追加<meta-data android:name="flutterEmbedding" android:value="2"/><plugin_name>/example/android/app/src/main/AndroidManifest.xml。 これにより、サンプル アプリが v2 埋め込みを使用するように設定されます。

  8. (オプション)EmbeddingV1Activity前のステップで、EmbeddingV1Activity<plugin_name>/example/android/app/src/main/AndroidManifest.xmlファイル。 例えば:

    AndroidManifest.xml
    <activity
         android:name=".EmbeddingV1Activity"
         android:theme="@style/LaunchTheme"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale"
         android:hardwareAccelerated="true"
         android:exported="true"
         android:windowSoftInputMode="adjustResize">
     </activity>

プラグインをテストする

残りの手順ではプラグインのテストに取り組みます。これをお勧めします。 しかし必須ではありません。

  1. アップデート<plugin_name>/example/android/app/build.gradleへの参照を置き換えるandroid.support.testandroidx.test:

    build.gradle
    defaultConfig {
       ...
       testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
       ...
     }
    build.gradle
    dependencies {
     ...
     androidTestImplementation 'androidx.test:runner:1.2.0'
     androidTestImplementation 'androidx.test:rules:1.2.0'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
     ...
     }
  2. テストファイルを追加MainActivityEmbeddingV1Activity<plugin_name>/example/android/app/src/androidTest/java/<plugin_path>/。 これらのディレクトリを作成する必要があります。例えば:

    MainActivityTest.java
    package io.flutter.plugins.firebase.core;
    
     import androidx.test.rule.ActivityTestRule;
     import io.flutter.plugins.firebasecoreexample.MainActivity;
     import org.junit.Rule;
     import org.junit.runner.RunWith;
    
     @RunWith(FlutterRunner.class)
     public class MainActivityTest {
       // Replace `MainActivity` with `io.flutter.embedding.android.FlutterActivity` if you removed `MainActivity`.
       @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
     }
    EmbeddingV1ActivityTest.java
    package io.flutter.plugins.firebase.core;
    
     import androidx.test.rule.ActivityTestRule;
     import io.flutter.plugins.firebasecoreexample.EmbeddingV1Activity;
     import org.junit.Rule;
     import org.junit.runner.RunWith;
    
     @RunWith(FlutterRunner.class)
     public class EmbeddingV1ActivityTest {
       @Rule
       public ActivityTestRule<EmbeddingV1Activity> rule =
           new ActivityTestRule<>(EmbeddingV1Activity.class);
     }
  3. 追加integration_testflutter_driverdev_dependency から<plugin_name>/pubspec.yaml<plugin_name>/example/pubspec.yaml

    pubspec.yaml
    integration_test:
       sdk: flutter
     flutter_driver:
       sdk: flutter
  4. 環境の最小 Flutter バージョンを更新します<plugin_name>/pubspec.yaml。すべてのプラグインが移動中 forward は最小バージョンを 1.12.13+hotfix.6 に設定します。 これは、サポートを保証できる最小バージョンです。 例えば:

    pubspec.yaml
    environment:
       sdk: ">=2.16.1 <3.0.0"
       flutter: ">=1.17.0"
  5. で簡単なテストを作成します<plugin_name>/test/<plugin_name>_test.dart。 v2 埋め込みサポートを追加する PR をテストする目的で、 私たちはプラグインの非常に基本的な機能をテストしようとしています。 これはプラグインが適切に登録されていることを確認するためのスモーク テストです。 新しいエンベダーを使用して。例えば:

    import 'package:flutter_test/flutter_test.dart';
     import 'package:integration_test/integration_test.dart';
    
     void main() {
       IntegrationTestWidgetsFlutterBinding.ensureInitialized();
    
       testWidgets('Can get battery level', (tester) async {
         final Battery battery = Battery();
         final int batteryLevel = await battery.batteryLevel;
         expect(batteryLevel, isNotNull);
       });
     }
  6. テスト実行してくださいintegration_testローカルでテストします。端末では、 以下をせよ:

     flutter test integration_test/app_test.dart
    

基本プラグイン

コードで Flutter Android プラグインを使い始めるには、 実装することから始めるFlutterPlugin

public class MyPlugin implements FlutterPlugin {
  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
    // TODO: your plugin is now attached to a Flutter experience.
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    // TODO: your plugin is no longer attached to a Flutter experience.
  }
}

上に示したように、プラグインは次のような場合があります (またはそうでない場合があります)。 での特定の Flutter エクスペリエンスに関連付けられる あらゆる瞬間。 プラグインの動作を初期化するように注意する必要があります のonAttachedToEngine()、プラグインをクリーンアップします の参照onDetachedFromEngine()

FlutterPluginBinding は、プラグインにいくつかの機能を提供します。 重要な参考文献:

binding.getFlutterEngine()
を返しますFlutterEngineプラグインがアタッチされているもの、 のようなコンポーネントへのアクセスを提供するDartExecutorFlutterRenderer、 もっと。
binding.getApplicationContext()
Android アプリケーションのContext実行中のアプリの場合。

UI/アクティビティプラグイン

プラグインが UI と対話する必要がある場合は、 権限のリクエストや Android UI クロムの変更など、 その場合は、プラグインを定義するために追加の手順を実行する必要があります。 実装する必要がありますActivityAwareインターフェース。

public class MyPlugin implements FlutterPlugin, ActivityAware {
  //...normal plugin behavior is hidden...

  @Override
  public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) {
    // TODO: your plugin is now attached to an Activity
  }

  @Override
  public void onDetachedFromActivityForConfigChanges() {
    // TODO: the Activity your plugin was attached to was
    // destroyed to change configuration.
    // This call will be followed by onReattachedToActivityForConfigChanges().
  }

  @Override
  public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) {
    // TODO: your plugin is now attached to a new Activity
    // after a configuration change.
  }

  @Override
  public void onDetachedFromActivity() {
    // TODO: your plugin is no longer associated with an Activity.
    // Clean up references.
  }
}

と対話するにはActivity、 あなたのActivityAwareプラグインは必須です 4つの段階で適切な行動を実装します。まず、プラグイン に取り付けられていますActivity。それにアクセスできますActivityと 提供されたコールバックの数ActivityPluginBinding

以来Activity構成変更中に破棄される可能性があります。 指定されたへの参照をクリーンアップする必要がありますActivityonDetachedFromActivityForConfigChanges()、 そしてそれらの参照を再確立しますonReattachedToActivityForConfigChanges()

最後に、onDetachedFromActivity()プラグインはクリーンアップする必要があります 関連するすべての参考資料をアップActivity動作と戻り 非 UI 構成。